class Solution {//leetcode1314——矩阵区域和
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int m=mat.size(),n=mat[0].size();
        //二位前缀和
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        //初始化二维前缀和矩阵
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++) dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mat[i-1][j-1];
        }

        vector<vector<int>> ret_martix(m,vector<int>(n));//输出结果
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                int x1=max(0,i-k),y1=max(0,j-k),x2=min(m-1,i+k),y2=min(n-1,j+k);
                ret_martix[i][j]=dp[x2+1][y2+1]-dp[x2+1][y1]-dp[x1][y2+1]+dp[x1][y1];
            }
        }
        return ret_martix;
    }
};